package com.core.shared;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Locale;
import java.util.Random;


public class DateTimeUtils {

    public static final DateTimeFormatter DEFAULTFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA);

    /**
     * 生成4位随机数
     *
     * @return 4位数字的字符串
     */
    public static String getSerial() {
        Random r = new Random();
        int number = r.nextInt(9000) + 1000;
        return String.valueOf(number);
    }

    /**
     * 生成范围内的随机数
     *
     * @param min 最小值
     * @param max 最大值
     * @return 指定范围的随机数
     */
    public static int getRandomNum(int min, int max) {
        Random r = new Random();
        return r.nextInt((max - min) + 1) + min;
    }

    /**
     * 获取当前时间
     *
     * @return 格式: yyyy-MM-dd HH:mm:ss
     */
    public static String getLocalDateTime() {
        return LocalDateTime.now().format(DEFAULTFORMATTER);
    }

    /**
     * 时间字符串转换成 LocalDateTime
     *
     * @param time 指定date-time
     * @return 将指定date-time按照默认格式：yyyy-MM-dd HH:mm:ss 格式化
     */
    public static LocalDateTime parseToLocalDateTime(String time) {
        return LocalDateTime.parse(time, DEFAULTFORMATTER);
    }


    /**
     * 获取当前时间,指定格式
     *
     * @param format 指定格式
     * @return 返回指定格式的date-time
     */
    public static String getLocalDateTime(String format) {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(format));
    }

    /**
     * 获取当前时间
     *
     * @return 格式: HH:mm:ss
     */
    public static LocalTime getNowTime() {
        return LocalTime.now().withNano(0);
    }

    /**
     * 本月第一天
     *
     * @return 格式：2018-02-01
     */
    public static LocalDate getFistDayOfMonth() {
        return LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
    }

    /**
     * 本月的第几天
     *
     * @param dayOfMonth from 1 to 28-31
     * @return 格式：2018-02-01
     */
    public static LocalDate getTheDayOfMonth(int dayOfMonth) {
        return LocalDate.now().withDayOfMonth(dayOfMonth);
    }

    /**
     * 本月最后一天
     *
     * @return 格式：2018-02-28
     */
    public static LocalDate getLastDayOfMonth() {
        return LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
    }

    /**
     * 某一天
     *
     * @param index 1:明天,-1:昨天
     * @return 格式：2018-02-01
     */
    public static LocalDate getSpecialDay(int index) {
        return LocalDate.now().plusDays(index);
    }

    /**
     * 当月的第一个星期几
     *
     * @param localDate 指定date
     * @param dayOfWeek week的枚举
     * @return 格式：2018-02-01
     */
    public static LocalDate firstDayOfWeekOfMonth(LocalDate localDate, DayOfWeek dayOfWeek) {
        return localDate.with(TemporalAdjusters.firstInMonth(dayOfWeek));
    }

    /**
     * 第一个date-time是否大于第二个date-time
     *
     * @param first  指定date-time
     * @param second 指定date-time
     * @return true/false
     */
    public static boolean theDayIsAfterByOneDay(String first, String second) {
        LocalDateTime firstDate = LocalDateTime.parse(first);
        LocalDateTime secondDate = LocalDateTime.parse(second);
        return firstDate.isAfter(secondDate);
    }

    /**
     * 判断生日
     *
     * @param day 指定date-time
     * @return true/false
     */
    public static boolean isBirthday(String day) {
        LocalDateTime localDateTime = LocalDateTime.parse(day);
        MonthDay birthday = MonthDay.of(localDateTime.getMonth(), localDateTime.getDayOfMonth());
        MonthDay currentMonthDay = MonthDay.from(LocalDate.now());
        return currentMonthDay.equals(birthday);
    }

}
